home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload Trio 2 / Shareware Overload Trio Volume 2 (Chestnut CD-ROM).ISO / dir24 / psi110g.zip / NR4.H < prev    next >
C/C++ Source or Header  |  1994-04-17  |  11KB  |  288 lines

  1. #ifndef _NR4_H
  2. #define _NR4_H
  3. /* nr4.h:  defines for netrom layer 4 (transport) support */
  4.   
  5. #ifndef _MBUF_H
  6. #include "mbuf.h"
  7. #endif
  8.   
  9. #ifndef _TIMER_H
  10. #include "timer.h"
  11. #endif
  12.   
  13. #ifndef _AX25_H
  14. #include "ax25.h"
  15. #endif
  16.   
  17. #ifndef _NETROM_H
  18. #include "netrom.h"
  19. #endif
  20.   
  21. /* compile-time limitations */
  22.   
  23. #define NR4MAXCIRC  20      /* maximum number of open circuits */
  24. #define NR4MAXWIN   127     /* maximum window size, send and receive */
  25.   
  26. /* protocol limitation: */
  27.   
  28. #define NR4MAXINFO  236     /* maximum data in an info packet */
  29.   
  30. /* sequence number wraparound mask */
  31.   
  32. #define NR4SEQMASK  0xff    /* eight-bit sequence numbers */
  33.   
  34. /* flags in high nybble of opcode byte */
  35.   
  36. #define NR4CHOKE    0x80
  37. #define NR4NAK      0x40
  38. #define NR4MORE     0x20    /* The "more follows" flag for */
  39.                             /* pointless packet reassembly */
  40.   
  41. /* mask for opcode nybble */
  42.   
  43. #define NR4OPCODE   0x0f
  44.   
  45. /* opcodes */
  46.   
  47. #define NR4OPPID    0       /* protocol ID extension to network layer */
  48. #define NR4OPCONRQ  1       /* connect request */
  49. #define NR4OPCONAK  2       /* connect acknowledge */
  50. #define NR4OPDISRQ  3       /* disconnect request */
  51. #define NR4OPDISAK  4       /* disconnect acknowledge */
  52. #define NR4OPINFO   5       /* information packet */
  53. #define NR4OPACK    6       /* information ACK */
  54. #define NR4NUMOPS   7       /* number of transport opcodes */
  55.   
  56. /* minimum length of NET/ROM transport header */
  57.   
  58. #define NR4MINHDR   5
  59.   
  60. /* host format net/rom transport header */
  61.   
  62. struct nr4hdr {
  63.     unsigned char opcode ;      /* opcode and flags */
  64.     unsigned char yourindex ;   /* receipient's circuit index */
  65.     unsigned char yourid ;      /* receipient's circuit ID */
  66.     unsigned char flags;        /* G8BPQ detection, etc. */
  67. #define NR4_G8BPQTTL    0x01
  68. #define NR4_G8BPQRTT    0x02
  69. #define NR4_G8BPQMASK   0x03
  70.   
  71.     union {
  72.   
  73.         struct {                /* network extension */
  74.             unsigned char family ;  /* protocol family */
  75.             unsigned char proto ;   /* protocol within family */
  76.         } pid ;
  77.   
  78.         struct {                /* connect request */
  79.             unsigned char myindex ; /* sender's circuit index */
  80.             unsigned char myid ;    /* sender's circuit ID */
  81.             unsigned char window ;  /* sender's proposed window size */
  82.             char user[AXALEN] ;     /* callsign of originating user */
  83.             char node[AXALEN] ;     /* callsign of originating node */
  84.             unsigned int t4init;    /* G8BPQ's transport timeout in seconds */
  85.   
  86.         } conreq ;
  87.   
  88.         struct {                /* connect acknowledge */
  89.             unsigned char myindex ; /* sender's circuit index */
  90.             unsigned char myid ;    /* sender's circuit ID */
  91.             unsigned char window ;  /* accepted window size */
  92.             unsigned char ttl;      /* G8BPQ's initial ttl */
  93.         } conack ;
  94.   
  95.         struct {                /* information */
  96.             unsigned char txseq ;   /* sender's tx sequence number */
  97.             unsigned char rxseq ;   /* sender's rx sequence number */
  98.         } info ;
  99.   
  100.         struct {                /* information acknowledge */
  101.             unsigned char rxseq ;   /* sender's rx sequence number */
  102.         } ack ;
  103.   
  104.     } u ;   /* End of union */
  105.   
  106. } ;
  107.   
  108. /* A netrom send buffer structure */
  109.   
  110. struct nr4txbuf {
  111.     struct timer tretry ;       /* retry timer */
  112.     unsigned retries ;          /* number of retries */
  113.     struct mbuf *data ;         /* data sent but not acknowledged */
  114. } ;
  115.   
  116. /* A netrom receive buffer structure */
  117.   
  118. struct nr4rxbuf {
  119.     unsigned char occupied ;    /* flag: buffer in use */
  120.     struct mbuf *data ;         /* data received out of sequence */
  121. } ;
  122.   
  123. /* address structure */
  124. struct nr4_addr {
  125.     char user[AXALEN];
  126.     char node[AXALEN];
  127. };
  128. #define NULLNRADDR  (struct nr4_addr *)0
  129.   
  130. struct sockaddr_nr {
  131.     short nr_family;
  132.     struct nr4_addr nr_addr;
  133. };
  134.   
  135. /* The netrom circuit control block */
  136.   
  137. struct nr4cb {
  138.     unsigned mynum ;            /* my circuit number */
  139.     unsigned myid ;             /* my circuit ID */
  140.     unsigned yournum ;          /* remote circuit number */
  141.     unsigned yourid ;           /* remote circuit ID */
  142.     struct nr4_addr remote ;        /* address of remote node */
  143.     struct nr4_addr local ;         /* our own address */
  144.   
  145.     unsigned window ;           /* negotiated window size */
  146.   
  147.     /* Data for round trip timer calculation and setting */
  148.   
  149.     long srtt ;                 /* Smoothed round trip time */
  150.     long mdev ;                 /* Mean deviation in round trip time */
  151.     unsigned blevel ;           /* Backoff level */
  152.     unsigned txmax ;            /* The maximum number of retries among */
  153.                                 /* the frames in the window.  This is 0 */
  154.                                 /* if there are no frames in the window. */
  155.                                 /* It is used as a baseline to determine */
  156.                                 /* when to increment the backoff level. */
  157.   
  158.     /* flags */
  159.   
  160.     char clone ;                /* clone this cb upon connect */
  161.     char choked ;               /* choke received from remote */
  162.     char qfull ;                /* receive queue is full, and we have */
  163.                                 /* choked the other end */
  164.     char naksent ;              /* a NAK has already been sent */
  165.   
  166.     /* transmit buffers and window variables */
  167.   
  168.     struct nr4txbuf *txbufs ;   /* pointer to array[windowsize] of bufs */
  169.     unsigned char nextosend ;   /* sequence # of next frame to send */
  170.     unsigned char ackxpected ;  /* sequence number of next expected ACK */
  171.     unsigned nbuffered ;        /* number of buffered TX frames */
  172.     struct mbuf *txq ;          /* queue of unsent data */
  173.   
  174.     /* receive buffers and window variables */
  175.   
  176.     struct nr4rxbuf *rxbufs ;   /* pointer to array[windowsize] of bufs */
  177.     unsigned char rxpected ;    /* # of next receive frame expected */
  178.     unsigned char rxpastwin ;   /* top of RX window + 1 */
  179.     struct mbuf *rxq ;          /* "fully" received data queue */
  180.   
  181.     /* Connection state */
  182.   
  183.     int state ;                 /* connection state */
  184. #define NR4STDISC   0           /* disconnected */
  185. #define NR4STCPEND  1           /* connection pending */
  186. #define NR4STCON    2           /* connected */
  187. #define NR4STDPEND  3           /* disconnect requested locally */
  188. #define NR4STLISTEN 4           /* listening for incoming connections */
  189.   
  190.     int dreason ;               /* Reason for disconnect */
  191. #define NR4RNORMAL  0           /* Normal, requested disconnect */
  192. #define NR4RREMOTE  1           /* Remote requested */
  193. #define NR4RTIMEOUT 2           /* Connection timed out */
  194. #define NR4RRESET   3           /* Connection reset locally */
  195. #define NR4RREFUSED 4           /* Connect request refused */
  196.   
  197.     /* Per-connection timers */
  198.   
  199.     struct timer tchoke ;       /* choke timeout */
  200.     struct timer tack ;         /* ack delay timer */
  201.     struct timer tdisc ;        /* Inactivity timer - WG7J */
  202.   
  203.     struct timer tcd ;          /* connect/disconnect timer */
  204.     unsigned cdtries ;          /* Number of connect/disconnect tries */
  205.   
  206.     void (*r_upcall) __ARGS((struct nr4cb *,int16));
  207.                     /* receive upcall */
  208.     void (*t_upcall) __ARGS((struct nr4cb *,int16));
  209.                     /* transmit upcall */
  210.     void (*s_upcall) __ARGS((struct nr4cb *,int,int));
  211.                     /* state change upcall */
  212.     int user ;          /* user linkage area */
  213. } ;
  214.   
  215. #define NULLNR4CB   (struct nr4cb *)0
  216.   
  217. /* The netrom circuit pointer structure */
  218.   
  219. struct nr4circp {
  220.     unsigned char cid ;         /* circuit ID; incremented each time*/
  221.                                 /* this circuit is used */
  222.     struct nr4cb *ccb ;         /* pointer to circuit control block, */
  223.                                 /*  NULLNR4CB if not in use */
  224. } ;
  225.   
  226. /* The circuit table: */
  227.   
  228. extern struct nr4circp Nr4circuits[NR4MAXCIRC] ;
  229.   
  230. /* Some globals */
  231.   
  232. extern unsigned short Nr4window ;   /* The advertised window size, in frames */
  233. extern long Nr4irtt ;           /* The initial round trip time */
  234. extern unsigned short Nr4retries ;  /* The number of times to retry */
  235. extern long Nr4acktime ;        /* How long to wait until ACK'ing */
  236. extern char *Nr4states[] ;      /* NET/ROM state names */
  237. extern char *Nr4reasons[] ;     /* Disconnect reason names */
  238. extern unsigned short Nr4qlimit ;       /* max receive queue length before CHOKE */
  239. extern long Nr4choketime ;      /* CHOKEd state timeout */
  240. extern char Nr4user[AXALEN];    /* User callsign in outgoing connects */
  241.   
  242. /* function definitions */
  243.   
  244. /* In nr4hdr.c: */
  245. int ntohnr4 __ARGS((struct nr4hdr *, struct mbuf **));
  246. struct mbuf *htonnr4 __ARGS((struct nr4hdr *));
  247.   
  248. /* In nr4subr.c: */
  249. void free_n4circ __ARGS((struct nr4cb *));
  250. struct nr4cb *get_n4circ __ARGS((int, int));
  251. int init_nr4window __ARGS((struct nr4cb *, unsigned));
  252. int nr4between __ARGS((unsigned, unsigned, unsigned));
  253. struct nr4cb *match_n4circ __ARGS((int, int,char *,char *));
  254. struct nr4cb *new_n4circ __ARGS((void));
  255. void nr4defaults __ARGS((struct nr4cb *));
  256. int nr4valcb __ARGS((struct nr4cb *));
  257. void nr_garbage __ARGS((int red));
  258.   
  259. /* In nr4.c: */
  260. void nr4input __ARGS((struct nr4hdr *hdr,struct mbuf *bp));
  261. int nr4output __ARGS((struct nr4cb *));
  262. void nr4sbuf __ARGS((struct nr4cb *, unsigned));
  263. void nr4sframe __ARGS((char *, struct nr4hdr *, struct mbuf *));
  264. void nr4state __ARGS((struct nr4cb *, int));
  265.   
  266. /* In nr4timer.c */
  267. void nr4ackit __ARGS((void *));
  268. void nr4cdtimeout __ARGS((void *));
  269. void nr4txtimeout __ARGS((void *));
  270. void nr4unchoke __ARGS((void *));
  271.   
  272. /* In nr4user.c: */
  273. void disc_nr4 __ARGS((struct nr4cb *));
  274. int kick_nr4 __ARGS((struct nr4cb *));
  275. struct nr4cb *open_nr4 __ARGS((struct nr4_addr *, struct nr4_addr *, int,
  276. void (*) __ARGS((struct nr4cb *, int)),
  277. void (*) __ARGS((struct nr4cb *, int)),
  278. void (*) __ARGS((struct nr4cb *, int, int)),int));
  279. struct mbuf *recv_nr4 __ARGS((struct nr4cb *, int16));
  280. void reset_nr4 __ARGS((struct nr4cb *));
  281. int send_nr4 __ARGS((struct nr4cb *, struct mbuf *));
  282.   
  283. /* In nrcmd.c: */
  284. void nr4_state __ARGS((struct nr4cb *, int, int));
  285. void donodetick __ARGS((void));  /* called from remote kick proc now */
  286.   
  287. #endif  /* _NR4_H */
  288.